﻿using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Common.plate.common
{
    

    public class PlateRecognizer : IDisposable
    {
        // YOLO目标检测模型（模拟实现，实际需替换为真实YOLO模型加载逻辑）
        private YoloV8 _detector;
        // OCR文字识别器
        private TextRecognizer _ocrRecognizer;

        /// <summary>
        /// 初始化车牌识别器
        /// </summary>
        /// <param name="detModelPath">检测模型路径</param>
        public PlateRecognizer(string detModelPath = @"D:\CKMA1663\source\repos\PlateTest01\Common\models\plate_detect.onnx",
            string ocrModelPath = @"D:\CKMA1663\source\repos\PlateTest01\Common\models\plate_rec_color.onnx",
            string charsPath = @"D:\CKMA1663\source\repos\PlateTest01\Common\models\plate_name.txt")
        {
            // 加载YOLO检测模型（模拟）
            _detector = new YoloV8(detModelPath);
            // 初始化OCR识别器（参数解析省略，实际需传入配置）
            _ocrRecognizer = new TextRecognizer(ocrModelPath, charsPath);
        }

        /// <summary>
        /// 识别图像中的车牌
        /// </summary>
        /// <param name="img">输入图像（OpenCvSharp的Mat对象）</param>
        /// <returns>识别到的车牌信息列表</returns>
        public List<PlateInfo> RecognizePlate(Mat img)
        {
            var plateObjs = new List<PlateInfo>();

            // 调用YOLO模型检测车牌（返回边界框和置信度）
            var detectionResults = _detector.Detect(img);

            // 遍历所有检测结果
            foreach (var result in detectionResults)
            {
                // 提取边界框坐标（x1,y1为左上角，x2,y2为右下角）
                int x1 = result.Box.Left;
                int y1 = result.Box.Top;
                int x2 = result.Box.Right;
                int y2 = result.Box.Bottom;

                //Rect是 OpenCV 中表示矩形区域的类，构造参数为(x, y, width, height)，分别对应矩形左上角的 x 坐标、y 坐标、宽度、高度
                var plateRoi = new Rect(Math.Max(0, x1),
                                        Math.Max(0, y1),
                                        Math.Min(img.Width - x1, x2 - x1),
                                        Math.Min(img.Height - y1, y2 - y1));

                // 确保区域有效
                if (plateRoi.Width <= 10 || plateRoi.Height <= 10)
                {
                    Console.WriteLine("车牌区域太小，跳过识别");
                    continue;
                }
                // 从原图中裁剪车牌区域
                using var plateMat = new Mat(img, plateRoi);  // 裁剪出车牌子图

                // 调用OCR识别车牌文字
                try
                {
                    var ocrResult = _ocrRecognizer.Recognize(new List<Mat> { plateMat });
                    if (ocrResult.Any())
                    {
                        // 封装识别结果
                        plateObjs.Add(new PlateInfo
                        {
                            Text = ocrResult[0].Text,
                            ScoreText = ocrResult[0].Score,
                            Bbox = new int[] { x1, y1, x2, y2 },
                            ScoreBbox = result.Confidence
                        });
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Environment.Exit(1);
                }
            }
            return plateObjs;
        }
        public void Dispose()
        {
            _detector?.Dispose();
            _ocrRecognizer?.Dispose();
        }

    }
    /// <summary>
    /// 车牌信息实体类，存储识别结果
    /// </summary>
    public class PlateInfo
    {
        public string Text { get; set; } // 车牌文字
        public float ScoreText { get; set; } // 文字识别置信度
        public int[] Bbox { get; set; } // 边界框坐标
        public float ScoreBbox { get; set; } // 检测框置信度
    }


}
